package br.com.games.hefesto;

/**
 * Interface para os possiveis comando executaveis por um jogo
 * 
 * @param <Holder> Tipo usado para manter o estado do jogo
 * @param <Moveable> Objeto que pode ser lancado durante o jogo
 * 
 * @since 2013
 * @author <a href="mailto:fernando.schindler@gmail.com">Fernando Schindler</a>
 */
public interface Game<Holder extends State, Moveable> {

	/**
	 * Executar o movimento indicado
	 * @param move Movimento escolhido
	 */
	void perform(Move<Moveable> move);

	/**
	 * Retornar ao estado antes do movimento indicado
	 * @param move Movimento previamente executado
	 */
	void undo(Move<Moveable> move);	
	
	/**
	 * Retorna o jogador atual
	 * @return {@link Player}
	 */
	Player<Holder, Moveable> getCurrent();
	
	/**
	 * Retorna o estado atual
	 * @return {@link State}
	 */
	Holder getState();
	
	/**
	 * Ir para o estado inicial
	 */
	void reset();
	
	/**
	 * Mostrar como se jogo esse jogo
	 */
	void help();
	
	/**
	 * pausar o jogo
	 */
	void pause();
	
	/**
	 * Sair do jogo
	 */
	void exit();

	/**
	 * Indica que o jogo ainda está online
	 * @return
	 */
	boolean isRunning();

	/**
	 * Indica que a partida terminou
	 * @return
	 */
	boolean isGameOver();

	/**
	 * Exibir creditos do vencedor
	 */
	void showWinner();
	
	/**
	 * Ajusta o primeiro a jogar
	 * @param team
	 */
	void setFirstTeam(Team team);
}
